home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / games / otoko / source.lzh / FuncEnemy / zako032.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-06-14  |  3.9 KB  |  177 lines

  1. /* 4面でわらわらと登場するザコ */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../otoko.h"
  5. #include "../player.h"
  6. #include "../enemy.h"
  7. #include "../eshot.h"
  8. #include "../effect.h"
  9. #include "../priority.h"
  10. #include "../sound.h"
  11. #include "../psearch.h"
  12. #include "../entry.h"
  13.  
  14. #define PALET_MAIN    0x0600
  15.  
  16. #define SPEED_1        4    /* 速度 */
  17. #define    SPEED_2        8    /* 2段階目の速度 */
  18.  
  19. #define ENTRY_CONTROL_ADD    1    /* entry_control に足す値 */
  20.  
  21.  
  22. static short points_disp;    /* 得点を表示するか */
  23.  
  24. static short EnemyMoveZako032 (ENEMY *);
  25. static void EnemyTiniZako032 (ENEMY *);
  26.  
  27.  
  28. /* ゲーム開始時に1回だけ呼ばれる */
  29. void EnemyInitStaticZako032 (void)
  30. {
  31.     points_disp = 0;
  32. }
  33.  
  34.  
  35.  
  36. void EnemyInitZako032 (ENEMY * p)
  37. {
  38.     if (p->lx < 0) {
  39.         /* 負のX座標が指定された場合はプレイヤーの反対側の画面左右から出現 */
  40.         if (player->x > 144) {
  41.             p->lx = (-32) * 65536;
  42.             p->angle = msearch (SHORT_LX, SHORT_LY, (256 + 16 + 32), SHORT_LY + 32);
  43.         } else {
  44.             p->lx = (256 + 16 + 32) * 65536;
  45.             p->angle = msearch (SHORT_LX, SHORT_LY, -32, SHORT_LY + 32);
  46.         }
  47.     } else {
  48.         if (player->x > 144)
  49.             p->lx = 144 * 65536 - p->lx;
  50.         else
  51.             p->lx = 144 * 65536 + p->lx;
  52.         p->angle = psearch (SHORT_LX, SHORT_LY);
  53.     }
  54.     p->vx = vxtable[SPEED_1][p->angle];
  55.     p->vy = vytable[SPEED_1][p->angle];
  56.     p->pt = obj_zako02;
  57.     p->hit_px = 12;
  58.     p->hit_py = 12;
  59.     p->hit_sx = 12;
  60.     p->hit_sy = 12;
  61.     p->hit_cx = 8;
  62.     p->damage = p->damage_core = 0;
  63.     p->hp = 1;
  64.     p->seq = 0;
  65.     p->m_work = 0;
  66.     p->s_work = p->s_work2 = p->s_work3 = 0;
  67.     p->pt = obj_zako03 + 2;
  68.     p->info = PALET_MAIN | PRIORITY_ZAKO;
  69.     p->core_pt = sp_core01;
  70.     p->core_info = PALET_CORE_BLUE | PRIORITY_ZAKO;
  71.  
  72.     p->func_enemy_move = EnemyMoveZako032;
  73.     p->func_enemy_tini = EnemyTiniZako032;
  74.  
  75.     entry_control += ENTRY_CONTROL_ADD;
  76. }
  77.  
  78.  
  79.  
  80. static short EnemyMoveZako032 (ENEMY * p)
  81. {
  82.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  83.     p->x = (p->lx += p->vx) >> 16;
  84.     p->y = (p->ly += p->vy) >> 16;
  85.  
  86.     switch (p->seq) {
  87.     case 0:
  88.         if (p->m_work++ > 30) {
  89.             p->seq++;
  90.         }
  91.         break;
  92.     case 1:
  93.         break;
  94.     }
  95.  
  96.     /* 攻撃開始 */
  97.     switch (p->s_work) {
  98.  
  99.     case 0:        /* 伸びる弾 */
  100. #define INTERVAL1_0        24
  101. #define SPEED_SHOT1_0    8
  102.         if (p->s_work2++ > INTERVAL1_0) {
  103.             p->s_work2 = 0;
  104.             switch (p->s_work3++) {
  105.             case 0:
  106.             case 1:
  107.                 {
  108.                     char a = psearch (SHORT_LX, SHORT_LY);
  109.                     EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT1_0, a, 0);
  110.                     EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT1_0 + 4, a, 0);
  111.                     SoundSetSE (SE_ESHOT);    /* 敵ショット音 */
  112.                 }
  113.                 break;
  114.             case 2:
  115.             default:
  116.                 p->core_info = PALET_CORE_RED | PRIORITY_ZAKO;    /* 赤くなる */
  117.                 p->s_work++;
  118.                 p->s_work3 = 0;
  119.                 p->vx = vxtable[SPEED_2][p->angle];
  120.                 p->vy = vytable[SPEED_2][p->angle];
  121.                 break;
  122.             }
  123.         }
  124.         break;
  125.  
  126.     case 1:
  127.         /* 画面外に出たら消去 */
  128.         /* (画面左右から出た判定と上下から出た判定を1回ずつの比較で行っている) */
  129.         if (((unsigned short) p->x > 256 + 32) || ((unsigned short) p->y > 256 + 32))
  130.             return (-1);    /* 消去 */
  131.         break;
  132.     }
  133.  
  134.  
  135.  
  136.     /* 自機ショットに当たった時の処理 */
  137.     /* ザコは一撃で死ぬのでコア云々は考慮しなくて良い */
  138.     if (p->damage) {
  139.         EffectInit (EFFECT_EXPLZAKO, 0, p->x, p->y);
  140.         SoundSetSE (SE_EXPL);
  141.         if (points_disp < ZAKO_SCORE_DISP) {
  142.             points_disp++;
  143.             if (p->core_info == (PALET_CORE_RED | PRIORITY_ZAKO))
  144.                 EffectInit (EFFECT_POINTS_RED, POINTS_600, p->x, p->y);
  145.             else
  146.                 EffectInit (EFFECT_POINTS_BLUE, POINTS_100, p->x, p->y);
  147.         } else {
  148.             if (p->core_info == (PALET_CORE_RED | PRIORITY_ZAKO))
  149.                 EffectInit (EFFECT_POINTS, POINTS_600, p->x, p->y);
  150.             else
  151.                 EffectInit (EFFECT_POINTS, POINTS_100, p->x, p->y);
  152.         }
  153.         return (-1);    /* 消去 */
  154.     }
  155.     xobj_set_st (p);
  156.  
  157.     /* コアの表示 */
  158.     p->core_x = p->x - 8;
  159.     p->core_y = p->y - 8;
  160.     xsp_set_st (&(p->core_x));
  161.  
  162.     return (0);
  163. }
  164.  
  165.  
  166.  
  167. static void EnemyTiniZako032 (ENEMY * p)
  168. {
  169. #define SPEED_SHOT1_1    10
  170.     char a = psearch (SHORT_LX, SHORT_LY);
  171.  
  172.     EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT1_1, a - 8, 0);
  173.     EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT1_1, a + 8, 0);
  174.  
  175.     entry_control -= ENTRY_CONTROL_ADD;
  176. }
  177.